이미지 I/O 이벤트 모니터하기 :: AWT스윙GUI[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

AWT스윙GUI
[1]
등록일:2008-04-11 14:45:47 (0%)
작성자:
제목:이미지 I/O 이벤트 모니터하기

글쓴이: Brian Burkhalter

Java Image I/O API는 자바 플랫폼에서의 이미지 작업을 위한 프레임워크를 제공하며, 이 프레임워크 내에서 javax.imageio.event 패키지는 이미지를 읽거나 쓰는 동안 생성되는 동기 이벤트를 모니터하기 위한 몇 가지 인터페이스를 정의한다.

이 인터페이스들은 다음과 같은 목적으로 사용할 수 있다.

  1. 이미지 읽기의 진행상황을 모니터한다.
  2. 이미지의 각 영역을 읽는 동안 통지 내용을 수신한다.
  3. 이미지 읽기에 관한 경고 메시지를 트랩한다.

이처럼 각각의 다양한 이벤트 모니터링은 사용중인 ImageReader에 리스너를 등록함으로써 가능하며, ImageReader 인스턴스는 ImageIO 클래스에서 획득할 수 있다. 다음 코드는 TIFF 이미지 포맷을 위한 리더를 검색하는 방법을 보여주고 있다.

ImageReader reader;
Iterator<ImageReader> readers = 
  ImageIO.getImageReadersByMIMEType("image/tiff");
if (readers.hasNext()) {
  reader = readers.next();
}

읽기 진행상황 모니터하기

이미지 읽기 진행상황을 모니터하는 데는 IIOReadProgressListener 인터페이스가 사용되며, addIIOReadProgressListener 메소드를 이용하여 ImageReaderIIOReadProgressListener의 구현을 등록한다. 예를 들어, 다음 코드는 ProgressMonitor를 사용하여 이미지 읽기 진행상황을 디스플레이하는 경우이다.

Component parentComponent;
String imageName;
ImageReader reader;

// Create a ProgressMonitor which displays percentage completed.
final ProgressMonitor pm =
    new ProgressMonitor(parentComponent, imageName, "0 %", 0, 100);

// Register an anonymous inner class implementing IIOReadProgressListener
reader.addIIOReadProgressListener(new IIOReadProgressListener() {
  // Close the ProgressMonitor if the read is aborted.
  public void readAborted(ImageReader source) {
    pm.close();
  }

  public void imageStarted(ImageReader source,
      int imageIndex) {
    // Abort the read if "cancel" pressed.
    if(pm.isCanceled()) {
      source.abort();
    }
  }

  // Set image progress to 100% upon completion.
  public void imageComplete(ImageReader source) {
    imageProgress(source, 100.0F);
  }
 
  // Update the progress bar and its label each time the reader
  // notifies the IIOReadProgressListener of a new percentage.
  public void imageProgress(ImageReader source, float percentageDone) {
    // Abort the read if "cancel" pressed.
    if(pm.isCanceled()) {
      source.abort();
      return;
    }
 
    // Update the progress and label.
    final int nv = (int)percentageDone;
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        pm.setProgress(nv);
        pm.setNote(nv+" %");
      }
    });
  }
 
  public void thumbnailStarted(ImageReader source, int imageIndex,
      int thumbnailIndex) { 
  }
 
  public void thumbnailProgress(ImageReader source, float percentageDone) {}
 
  public void thumbnailComplete(ImageReader source) {}
 
  public void sequenceStarted(ImageReader source, int minIndex) {}
 
  public void sequenceComplete(ImageReader source) {}
});

ProgressMonitor는 이미지 로딩이 진행됨에 따라 왼쪽에서 오른쪽으로 채워지는 진행상황 막대(progress bar)를 디스플레이한다. 이미지 읽기가 시작되면 리더는 imageStarted 메소드를 호출하고 리스너는 ProgressMonitor의 "cancel" 버튼이 눌렸는지 여부를 확인한다. 취소를 선택하면 읽기가 중단된다. 취소될 경우, 리더는 readAborted 메소드를 호출하여 ProgressMonitor를 닫는다.

읽기가 진행되는 동안 리더는 업데이트된 진행상황 값으로 imageProgress 메소드를 주기적으로 호출하고, 읽기가 취소되었는지 여부를 확인한 후 리스너는 ProgressMonitor를 새로운 진행상황 값과 퍼센티지 값 문자열로 업데이트한다. 단, 리스너는 imageProgress 메소드를 호출 스레드에서가 아니라 Swing 이벤트 스레드 상에서 ProgressMonitor를 업데이트한다는 점에 유의할 것. 이미지 읽기가 완료되면 리더는 imageComplete 메소드를 호출하여 완료된 퍼센티지 값을 100으로 설정한다.

아래 그림은 ProgressMonitor가 진행상황 막대를 업데이트하는 모습을 보여준다.

ProgressMonitor

사용자는 IIOReadProgressListener 클래스의 썸네일 메소드를 이용하여 썸네일 로딩의 진행상황을 모니터할 수 있다.

영역 업데이트 통지 수신하기

이미지의 각 영역을 읽는 동안 이루어지는 통지 수신에는 IIOReadUpdateListener 인터페이스가 사용되며, 이미지 영역은 스캔라인 방식 이미지인 경우에는 하나의 픽셀 열(row) 또는 타일 방식 이미지인 경우에는 하나의 타일로 구성될 수 있다. addIIOReadUpdateListener 메소드를 이용하여 ImageReaderIIOReadUpdateListener 구현을 등록한다.

가령, 이미지 디스플레이 컴포넌트는 다음과 같이 IIOReadProgressListener를 구현할 수 있다.

public void imageUpdate(ImageReader reader, BufferedImage image,
    int minX, int minY, int width, int height,
    int periodX, int periodY, int[] bands) {
  // Set the displayed image to the parameter image.
  setImage(image);
 
  // Repaint the sections of the image just updated.
  repaint(0L, minX, minY, width, height);
}
 
public void passStarted(ImageReader reader, BufferedImage image,
    int pass, int minPass, int maxPass,
    int minX, int minY,
    int periodX, int periodY, int[] bands) {}
     
public void passComplete(ImageReader reader, BufferedImage image) {}
     
public void thumbnailPassStarted(ImageReader reader, BufferedImage image,
    int pass, int minPass, int maxPass,
    int minX, int minY,
    int periodX, int periodY, int[] bands) {}
         
public void thumbnailPassComplete(ImageReader reader,
    BufferedImage image) {}

ImageReaderimageUpate 메소드를 호출할 때, 메소드는 먼저 setImage 메소드를 호출하여 디스플레이 컴포넌트를 디스플레이하는 데 필요한 초기화를 수행한다.

/** Instance variable for the image being displayed. */
BufferedImage theImage = null;

/** Initialize the display component using the provided image. */
protected void setImage(BufferedImage image) {
  if(image != theImage) {
    // Save the reference.
    theImage = image;
    // Initialize the display component as needed.
    // --- CODE OMITTED ---
  }
}        

그런 다음 디스플레이 컴포넌트는 repaint 메소드를 호출하여 막 로드된 이미지 영역을 드로우(draw)한다.

이미지 영역이 업데이트될 때 통지를 받는 것은 대형 이미지를 읽어들일 때 특히 중요하다. 한편 업데이트 통지는 디스플레이 컴포넌트가 전체 이미지가 로드될 때까지 기다렸다가 이미지를 드로우하는 것이 아니라 각 영역이 읽히는 동안 바로 페인트할 수 있게 해준다.

경고 메시지 트랩하기

이미지를 읽는 동안 ImageReader에 의해 생성되는 경고 메시지를 트랩하는 데는 IIOReadWarningListener 인터페이스가 사용된다. addIIOReadWarningListener() 메소드를 이용하여 ImageReaderIIOReadWarningListener의 구현을 등록한다. 예를 들어, 아래 코드는 JDialog를 이용하여 경고 메시지의 텍스트를 디스플레이하는 경우이다.

Component parentComponent;
String imageName;
ImageReader reader;

// Create a text area to contain the warning message(s).
final JTextArea text = new JTextArea();
text.setColumns(60);
text.setLineWrap(true);
text.setWrapStyleWord(true);

// Create a warning option pane to contain the text area.
JOptionPane opt = new JOptionPane(new JScrollPane(text),
    JOptionPane.WARNING_MESSAGE, JOptionPane.DEFAULT_OPTION);

// Create a modal dialog for the option pane.
final JDialog dialog =
    opt.createDialog(JOptionPane.getFrameForComponent(parentComponent),
    "Warnings: "+imageName);
dialog.setModal(false);

// Register an anonymous inner class implementing IIOReadWarningListener
reader.addIIOReadWarningListener(new IIOReadWarningListener() {
  public void warningOccurred(ImageReader source,
      final String warning) {
    // Append the current warning to the text area.
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        text.append("[WARNING]: "+ warning+"\n");
        dialog.pack();
        dialog.setVisible(true);
      }
    });
  }
});

ImageReader가 경고 메시지를 내보낼 때는 warningOccured 메소드를 호출하여 메시지를 텍스트 영역에 첨부하고 경고 대화상자를 디스플레이한다. 단, 경고 대화상자는 warningOccurred 메소드를 호출 스레드에서가 아니라 Swing 이벤트 스레드 상에서 업데이트된다는 점에 유의할 것.

아래 그림은 경고 대화상자를 보여준다.

Warning dialog


이미지 쓰기 이벤트 모니터하기

이미지를 쓰는 동안 이미지 I/O 이벤트를 모니터하는 작업은 이미지를 읽는 동안 이벤트를 모니터하는 경우와 매우 유사하다. IIOWriteProgressListenerIIOWriteWarningListener 인터페이스는 각각 IIOReadProgressListenerIIOReadWarningListener에 해당하며, 위에서 설명한 바와 같이 ImageReader에서 후자의 인터페이스를 사용하는 것처럼 ImageWriter에서 이들을 사용하면 된다.

관련 상세 정보

다음 문서에 Image I/O API에 관한 자세한 내용이 나와 있으니 참고하기 바란다.

[본문링크] 이미지 I/O 이벤트 모니터하기
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=7364
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.